package logica.pisos;

import java.awt.Color;

import logica.coleccionables.Coleccionable;
import logica.obstaculos.Obstaculo;
import logica.obstaculos.ObstaculoDestructible;
import logica.premios.Premio;

/**
 * Clase PisoTransitable: modela un piso transitable del nivel. 
 * @author Amorosi, Javier (94528)
 * @author Antiman, Nehuen (102440)
 */
public abstract class PisoTransitable extends Piso {
	
	protected Obstaculo obstaculo;
	protected Coleccionable coleccionable;
	protected Premio premio;
	protected Color color;

	/**
	 * Constructor de la clase PisoTransitable. 
	 * @param f representa el índice de fila.
	 * @param c	representa el índice de columna.
	 */
	public PisoTransitable(int f, int c) {
		super(f, c);
		obstaculo=null;
		premio=null;
		coleccionable=null; 
	}
	
	/**
	 * En caso de que haya un premio en el piso y no haya algun obstáculo que impida su recolección 
	 * esta operación retornará el premio. Caso contrario retornará valor null. 
	 * Luego de invocar a esta operación si habia algun premio en el piso, ya no lo habrá. 
	 * @return un Premio si el piso tiene alguno, sin tener algun obstaculo. Caso contrario retorna null. 
	 */
	public Premio proveerPremio(){
		Premio toR =null;
		if (!tieneObstaculo()){
			toR = premio;
			premio=null;
		}
		return toR;	
	}
	
	/**
	 * Retorna un objeto coleccionable si hay alguno en el piso. 
	 * @return un objeto Coleccionable si habia alguno.
	 */
	public Coleccionable proveerColeccionable(){
		Coleccionable toR = coleccionable;
		coleccionable = null;
		return toR;
	}
	
	/**
	 * Pinta el piso según el color indicado en el parámetro. 
	 * @param c nuevo color del piso.
	 */
	public void pintar(Color c){
		color = c;
	}

	@Override
	public void dispararPiso() {
		obstaculo.serDisparado();
		if(obstaculo.esDestructible()){
			ObstaculoDestructible aux = (ObstaculoDestructible)obstaculo;
			if (aux.getResistencia()<=0)
				obstaculo=null;
		}
	}

	@Override
	public void colocarPremio(Premio p){
			premio=p;
	}
	
	@Override
	public boolean colocarColeccionable(Coleccionable c){
		boolean r=!tieneColeccionable() && !tienePremio() && !tieneObstaculo();
		if (r)
			coleccionable=c;
		return r;
	}
	
	@Override
	public void colocarObstaculo(Obstaculo o){
			obstaculo=o;
	}
	
	@Override
	public boolean puedoPasar() {
		return !tieneColeccionable() && !tieneObstaculo();
	}
	
	/**
	 * Retorna un valor booleando indicando si algun premio se encuentra sobre el 
	 * piso (que no sea oculto por algun obstáculo).
	 * @return true si existe algun premio no oculto por un obstáculo sobre el piso, false caso contrario. 
	 */
	public boolean tienePremio(){
		return (premio!=null);
	}
	
	/**
	 * Retorna un valor booleando indicando si algun obstáculo se encuentra sobre el 
	 * piso.
	 * @return true si existe algun obstáculo sobre el piso, false caso contrario. 
	 */
	public boolean tieneObstaculo(){
		return (obstaculo!=null);
	}
	
	/**
	 * Retorna un valor booleando indicando si algun objeto coleccionable se encuentra sobre el 
	 * piso.
	 * @return true si existe algun objeto coleccionable sobre el piso, false caso contrario. 
	 */
	public boolean tieneColeccionable(){
		return(coleccionable!=null);
	}
	
	@Override
	public boolean tieneAlgo(){
		return tieneColeccionable() || tienePremio() || tieneObstaculo(); 
	}
	
	/**
	 * Retorna un número natural indicando el consumo de combustible que conlleva transitar sobre este piso. 
	 * @return consumo de combustible para transitar el piso. 
	 */
	public abstract int consumoCombustible();
	
	/**
	 * Retorna el color del piso.
	 * @return color del piso. 
	 */
	public Color getColor(){
		return color;
	}

}
